/**
 * @FileName: SkuValidator.java
 * @Author
 * @Description:
 * @Date 2016年4月29日 下午5:04:10
 * @CopyRight ZTE Corporation
 */
package cn.hpclub.server.validator.admin.product;

import java.util.Enumeration;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.jfinal.core.Controller;
import com.jfinal.validate.Validator;

import cn.hpclub.server.model.product.Sku;
import cn.hpclub.server.model.product.SkuOpt;

public class SkuValidator extends Validator{

    @Override
    protected void validate(Controller c){
        validateSkuName(c);
        validateOptNames(c);
    }

    /**
     * @Title: validateSkuName
     * @Description:校验Sku的name
     * @param c
     */

    private void validateSkuName(Controller c){
        this.validateRequired("sku.name", "skuNameMessages", "名称不能为空");
        validateRegex("sku.name", "^[\u4e00-\u9fa5_a-zA-Z0-9_]{1,32}$", "skuNameMessages",
                      "Sku名称为1-32个字母、汉字、数字、下划线的组合");

        this.setShortCircuit(true);
        validateRequiredString("sku.sort", "skuSort", "排序不能为空");
        validateRegex("sku.sort", "^\\d+$", "skuSort", "排序只能是纯数字");

        String name = c.getPara("sku.name");
        String id = c.getPara("sku.id");
        Sku sku = null;
        if(c.getParaToBoolean("isAdd")){
            sku = Sku.dao.findFirst("select id from sku s where s.name=?", name);
        } else{
            sku = Sku.dao.findFirst("select id from sku s where s.name=? and s.id <>?", name, id);
        }
        if(sku != null){// 说明已经存在这个名字
            addError("skuNameMessages", "名称不能重复，已存在" + name);
        }
    }

    /**
     * @Title: validateOptNames
     * @Description:
     * @param Controller
     */

    private void validateOptNames(Controller c){
        Enumeration<String> names = c.getParaNames();
        Set<String> optValues = new HashSet<String>();
        boolean valid = true;

        valid = validateNewOpt(c, optValues);// 验证新增的opt
        if(!valid){// 说明有相同的名称
            addError("skuOptMessages", "属性值中有相同的，请检查");
            return;
        }
        valid = validateAllOpt(c, names, optValues);
        if(!valid){// 说明有相同的名称
            addError("skuOptMessages", "属性值中有相同的，请检查");
        } else{
            optValues = null;
            names = null;
        }
    }

    /**
     * @Title: validateAllOpt
     * @Description:验证所有的opt是否有相同的
     * @param c
     * @param names
     * @param optValues
     * @param valid
     * @return boolean
     */

    private boolean validateAllOpt(Controller c, Enumeration<String> names, Set<String> optValues){
        boolean valid = true;
        String prefix = "opts_";
        while(names.hasMoreElements()){// 以前的opt
            String name = names.nextElement();
            if(name.startsWith(prefix)){// opts_...
                validateRequired(name, "skuOptMessages", "属性值名称不能为空");
                validateRegex(name, "^[\u4e00-\u9fa5_a-zA-Z0-9_]{1,32}$", "skuOptMessages", "属性值为1-32个字母、汉字、数字、下划线的组合");
                valid = optValues.add(c.getPara(name));
                if(!valid){
                    optValues = null;
                    break;
                }
            }
        }
        return valid;
    }

    /**
     * @Title: validateNewOpt
     * @Description:校验新增的opt是否有相同的
     * @param c
     * @param optValues，返回的set含有新增的opt，可以与以前的进行比较
     * @param valid
     * @return boolean
     */

    private boolean validateNewOpt(Controller c, Set<String> optValues){
        boolean valid = true;
        String[] newOpts = c.getParaValues("opts");
        if(newOpts != null){
            for(String opt : newOpts){
                validateRequired(opt);
                validateRegex(opt);
                valid = optValues.add(opt);
                if(!valid){// 第一次插不进去就说明有相同的，以后就不执行了
                    optValues = null;
                    break;
                }
            }

        }
        return valid;
    }

    /**
     * @Title: validateRegex
     * @Description:正则校验
     */

    private void validateRegex(String opt){
        Pattern pattern = Pattern.compile("^[\u4e00-\u9fa5_a-zA-Z0-9_]{1,32}$");
        Matcher matcher = pattern.matcher(opt);
        if(!matcher.matches())
            addError("skuOptMessages", "属性值为1-32个字母、汉字、数字、下划线的组合");
    }

    /**
     * @Title: validateRequired
     * @Description:校验为空
     */

    private void validateRequired(String opt){
        if(opt == null || "".equals(opt)){
            addError("skuOptMessages", "属性值名称不能为空");
        }
    }

    @Override
    protected void handleError(Controller c){
        if(!c.getParaToBoolean("isAdd")){
            c.keepModel(Sku.class);
            int skuId = c.getParaToInt("sku.id");
            // 准备本sku的所有的opt
            List<SkuOpt> opts = SkuOpt.dao.find("select * from sku_opt o where sku_id=?", skuId);
            c.setAttr("opts", opts);
        }
        c.render("/admin/sku_input.tpl");
    }

}
